SenseMyFEUP data

Data loading

Data is filtered by travelmode (car and bus) and date (April 2016).

Intersession times

Visualizing intersession times

All intersession time Porto April16

Intersession time along the week

We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`

Histogram intersession time.

We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`

Number of sessions per way_id

Filtering by sessions per way_id

Number of sessions per way_id

Error in filter_impl(.data, quo) : 
  Evaluation error: comparison (6) is possible only for atomic and list types.

ECDF

ECDF by #sessions

Edges with >50 sessions.

We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`

Top 10% points

Map points April 2016

Showing maps

Traffic Map April Porto 2016 all

Traffic Map April 2016 all >50

Traffic day Map April 2016

Traffic night Map April 2016

Top 12 edges

Map Intersession time (<1.3h) day.

Map Intersession time (<2h)night.

–>

#Sessions by date >50

Day of the week

By day

By hour

Speeds >50

df_hotedges_april16pt %>% 
  group_by(hour =hour(time)) %>% 
  summarise(avg_speed = mean((speed*18)/5)) %>% 
  ggplot(aes(hour, avg_speed)) + 
  geom_line() +
  scale_x_continuous(breaks = seq(0,23,1))+
  ylab("Avg speed km/h")

Speed by week

Speed by day

Speed by hour

Number of session per hour

Ways_ids per half hour

prueba <- table(cut(filter(df_hotedges_april16pt, day(time) < 7)$time, breaks = "30 mins"))
plot(prueba, xlab = "date", ylab = "frequency") 

Time serie per way_id

filter(df_hotedges_april16pt, way_id == 37141967 ) %>% 
  group_by(day(time)) %>% 
  ggplot(aes(x= time, y= (speed*18)/5)) + 
  geom_line()

Points tirados

LS0tCnRpdGxlOiAnU2Vuc2UgTXkgRkVVUCAtIEFwcmlsIDIwMTYgRGF0YScKYXV0aG9yOiAiRGFuaWVsYSBTLiBHaWwiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIGVjaG8gPSBGQUxTRSwgZXZhbD1GQUxTRX0Kc2F2ZS5pbWFnZSgiU2Vuc2VteVdvcmtTcGFjZS5SRGF0YSIpCiNsb2FkKCJkZl9maXJzdF9zZXNzaW9uX2NhcnNfYXByaWwxNi5SZGEiKQpsb2FkKCJTZW5zZW15V29ya1NwYWNlLlJEYXRhIikKCmBgYAoKCiMgU2Vuc2VNeUZFVVAgZGF0YQojIyBEYXRhIGxvYWRpbmcKIERhdGEgaXMgZmlsdGVyZWQgYnkgdHJhdmVsbW9kZSAoY2FyIGFuZCBidXMpIGFuZCBkYXRlIChBcHJpbCAyMDE2KS4gICAgICAKCmBgYHtyIGVjaG89RkFMU0V9CiNGaWx0ZXJpbmcgYnkgcmVjdGFuZ2xlIGluIFBvcnRvIAoKZGZfZWRnZXNfYXByaWwxNiA8LSBkZl9zcGVlZAoKZGZfZWRnZXNfYXByaWwxNnB0IDwtIGRmX3NwZWVkICU+JSAKICBmaWx0ZXIobGF0IDwgNDEuMTg1OTM1MjgwODE1NSwgbGF0ID4gNDEuMTM2NDcyNjU0NiwgbG9uID4gLTguNjkxMjk0MDY4MTQwNSwgbG9uIDwgLTguNTUzOTY5MzQyMjgpCmBgYAoKIyMgSW50ZXJzZXNzaW9uIHRpbWVzCgojIyMgVmlzdWFsaXppbmcgaW50ZXJzZXNzaW9uIHRpbWVzCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CgojR2V0dGluZyBkYXRhIGZyb20gZGZfc3BlZWQKCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgPC0gZGZfZWRnZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQsIHNlc3Npb25faWQpICU+JSAKICBzdW1tYXJpc2Uoc2Vjb25kcyA9IG1pbihzZWNvbmRzKSkKCiMgVHJhbnNmb3JtaW5nIHNlY29uZHMgdG8gdGltZXN0YW1wIGFuZCBjYWxjdWxhdGluZyBpbnRlcnNlc3Npb24gdGltZS4KCmRmX3NwZWVkX3RvcCR0aW1lIDwtIGFzLlBPU0lYY3QoZGZfc3BlZWRfdG9wJHNlY29uZHMsIG9yaWdpbj0iMTk3MC0wMS0wMSIpCgpkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0JHRpbWUgPC0gYXMuUE9TSVhjdChkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0JHNlY29uZHMsIG9yaWdpbj0iMTk3MC0wMS0wMSIpCmRmX2VkZ2VzX2FwcmlsMTZwdCR0aW1lIDwtIGFzLlBPU0lYY3QoZGZfZWRnZXNfYXByaWwxNnB0JHNlY29uZHMsIG9yaWdpbj0iMTk3MC0wMS0wMSIpCgpkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0IDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgICU+JQogIGFycmFuZ2UoZGVzYyh3YXlfaWQpLCB0aW1lKSAlPiUgCiAgbXV0YXRlKGludGVyc2Vzc2lvbl90aW1lID0gYygwLGFzLm51bWVyaWMoZGlmZih0aW1lKSwgdW5pdHM9Im1pbnMiKSkpCgojIFJlbW92ZSBNaW4gY29sdW1uCiMgZGZfaW50ZXJzZXNzaW9uX2FwcmlsJG1pbiA8LSBOVUxMIApgYGAKCkFsbCBpbnRlcnNlc3Npb24gdGltZSBQb3J0byBBcHJpbDE2IApgYGB7ciBlY2hvPUZBTFNFfQpwbG90X2x5KHkgPSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0JGludGVyc2Vzc2lvbl90aW1lLCB0eXBlID0gImJveCIsIG5hbWUgPSAiQWxsIHdheV9pZHMiKSAlPiUgCiAgYWRkX2JveHBsb3QoeT0gZmlsdGVyKGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGludGVyc2Vzc2lvbl90aW1lID4gMCApJGludGVyc2Vzc2lvbl90aW1lLCBuYW1lID0gIkF0IGxlYXN0IDIgc2Vzc2lvbnMiKSAlPiUgCiAgbGF5b3V0KHRpdGxlPSJJbnRlcnNlc3Npb24gdGltZSAobWlucykiLCB5YXhpcyA9IGxpc3QocmFuZ2UgPSBjKDAsNTAwMCkpKQoKYGBgCgpJbnRlcnNlc3Npb24gdGltZSBhbG9uZyB0aGUgd2VlayAKYGBge3IgZWNobz1GQUxTRX0KcCA8LSBnZ3Bsb3QoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCwgYWVzKHggPSB3ZWVrZGF5cyh0aW1lKSwgeSA9IGludGVyc2Vzc2lvbl90aW1lLCBmaWxsID0gaW50ZXJhY3Rpb24od2Vla2RheXModGltZSkpICkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICB4bGFiKCJEYXlzIG9mIHRoZSB3ZWVrIiApICsKICB5bGFiKCJJbnRlcnNlc3Npb24gdGltZSAobWlucykiKSArCiAgZ2d0aXRsZSgiSW50ZXJzZXNzaW9uIHRpbWUobWluKSBpbiB0aGUgd2VlayAiKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiRG9taW5nbyIsICJTZWd1bmRhIiwgIlRlcsOnYSIsICJRdWFydGEiLCAiUXVpbnRhIiwgCiAgICAiU2V4dGEiLCAiU8OhYmFkbyIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMTAwMDApKQoKCnAgPC0gcGxvdGx5X2J1aWxkKHApCnAKCmBgYAoKSGlzdG9ncmFtIGludGVyc2Vzc2lvbiB0aW1lLgpgYGB7ciBlY2hvPUZBTFNFfQoKaW50MiA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JQogIGZpbHRlcihpbnRlcnNlc3Npb25fdGltZSA+IDApICU+JSAKICBnZ3Bsb3QoYWVzKGludGVyc2Vzc2lvbl90aW1lLzYwKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDkpICsgCiAgZ2d0aXRsZSgiSW50ZXJzZXNzaW9uIHRpbWUgKGhvdXJzKSIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbT1jKDAsMzAwKSkKaW50MiA8LSBnZ3Bsb3RseShpbnQyKQoKaW50MyA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JQogIGZpbHRlcihpbnRlcnNlc3Npb25fdGltZSA+IDApICU+JSAKICBnZ3Bsb3QoYWVzKGludGVyc2Vzc2lvbl90aW1lLzYwKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwyNSkpCmludDMgPC0gZ2dwbG90bHkoaW50MykKCnN1YnBsb3QoaW50MixpbnQzLCBucm93cyA9IDIpCmBgYAoKTnVtYmVyIG9mIHNlc3Npb25zIHBlciB3YXlfaWQKCmBgYHtyIGVjaG89RkFMU0UsICBtZXNzYWdlPUZBTFNFfQppbnQxIDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbigpKSAlPiUgIAogIGdncGxvdChhZXMoeCA9bl9zZXNzaW9ucykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsMTUwKSkgKwogIGdndGl0bGUoIk51bWJlciBvZiBzZXNzaW9ucyBwZXIgd2F5X2lkIGluIFBvcnRvIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDUwLCBzaXplID0gMSwgY29sb3VyID0gIiNGRjM3MjEiLAogICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIikKCmdncGxvdGx5KGludDEpCmBgYAoKIyMjIEZpbHRlcmluZyBieSBzZXNzaW9ucyBwZXIgd2F5X2lkIAoKTnVtYmVyIG9mIHNlc3Npb25zIHBlciB3YXlfaWQgCmBgYHtyIGVjaG89RkFMU0V9CmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0ICU+JSBncm91cF9ieShoID0gaG91cih0aW1lKSkgJT4lICBzdW1tYXJpc2UobiA9IG5fZGlzdGluY3Qoc2Vzc2lvbl9pZCkpICAlPiUgCiAgZ2dwbG90KGFlcyh4PSBoLCB5ID0gbikpICsKICBnZW9tX2xpbmUoKQpgYGAKIAoKYGBge3IgZWNobz1GQUxTRX0KI0NyZWF0ZSBkZiB3aXRoIHdheV9pZHMgd2l0aCA+NTAgc2Vzc2lvbnMKCmRmX2lkX2hvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lICAKICBmaWx0ZXIobl9zZXNzaW9ucyA+PSA1MCkgCgpkZl9ob3RlZGdlc19hcHJpbDE2cHQgPC0gZGZfaWRfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBtZXJnZSh5PSBkZl9lZGdlc19hcHJpbDE2cHQsIGJ5PSJ3YXlfaWQiKQoKZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkKSAlPiUgCiAgc3VtbWFyaXNlKG5fc2Vzc2lvbnMgPSBuKCkpICU+JSAgCiAgZmlsdGVyKG5fc2Vzc2lvbnMgPj0gMjAwKSAKCmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2lkX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgbWVyZ2UoeT0gZGZfZWRnZXNfYXByaWwxNnB0LCBieT0id2F5X2lkIikKCgpkZl9zZXNzaW9uc18xMDBlZGdlc19hcHJpbDE2cHQgPC0gZGZfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAgCiAgc3VtbWFyaXNlKHNlc3Npb25zID0gbl9kaXN0aW5jdChzZXNzaW9uX2lkKSkgJT4lIAogIGZpbHRlcihzZXNzaW9ucz4xMDApICU+JSAKICBtZXJnZSh5PSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCB1c2luZyA9IHdheV9pZCkgCgpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9IAojIFBPSU5UUyBmb3IgbWFwcGluZwoKI0FsbCB3aXRoIHNlc3Npb25zID4gNTAKZGZfcG9pbnRzX2hvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lIAogIGZpbHRlcihuX3Nlc3Npb25zID49IDUwKSAlPiUgCiAgbWVyZ2UoIHkgPSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCBieSA9ICJ3YXlfaWQiKSAKCmRmX3BvaW50c19zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lIAogIGZpbHRlcihuX3Nlc3Npb25zID49IDIwMCkgJT4lIAogIG1lcmdlKCB5ID0gZGZfcG9pbnRzX2VkZ2Vfb3NtX2FwcmlsMTZwdCwgYnkgPSAid2F5X2lkIikgCgoKZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgPC1tdXRhdGUoZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQsIGNsYXNzID0gaWZlbHNlKGhvdXIodGltZSkgPj03ICYgaG91cih0aW1lKSA8PSAyMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAibmlnaHQiKSkKCgojRGF5CmRmX3BvaW50c19ob3RlZGdlc19hcHJpbDE2cHRfZCA8LSBkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcihob3VyKHRpbWUpID49NywgaG91cih0aW1lKTw9IDIwLCBuX3Nlc3Npb25zID49IDUwKSAlPiUgCiAgbWVyZ2UoIHkgPSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCBieSA9ICJ3YXlfaWQiKSAKCiMgTmlnaHQKZGZfcG9pbnRzX2FwcmlsMTZwdF9uaWdodF9uIDwtIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKGhvdXIodGltZSkgPDcgfCBob3VyKHRpbWUpID4gMjAsIG5fc2Vzc2lvbnMgPj0gMjApICU+JSAKICBtZXJnZSggeSA9IGRmX3BvaW50c19lZGdlX29zbV9hcHJpbDE2cHQsIGJ5ID0gIndheV9pZCIpIAoKYGBgCgojIyMgRUNERiAKYGBge3IgZWNobz1GQUxTRX0KZTEgPC0gZ2dwbG90KHN1YnNldChkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBpbnRlcnNlc3Npb25fdGltZSA+IDApLCBhZXMoaW50ZXJzZXNzaW9uX3RpbWUpKSArIAogIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArCiAgeGxhYigiSW50ZXJzZXNzaW9uIHRpbWUobWlucykiKQoKZTIgPC0gZ2dwbG90KHN1YnNldChkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBpbnRlcnNlc3Npb25fdGltZSA+IDApLCBhZXMoaW50ZXJzZXNzaW9uX3RpbWUpKSArIAogIHNjYWxlX3hfbG9nMTAoKSArc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICArIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lIExvZyIpCgpncmlkLmFycmFuZ2UoZTEsIGUyLCBuY29sPSAyLCB0b3AgPSAiSW50ZXJzZXNzaW9uIHRpbWUgYWxsIHNlc3Npb25zIFBvcnRvIChtaW5zKSIpCmBgYAogCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CgojRG9udCwgd2l0aG91dCBjb2xvcnMKZTMgPC0gIGdncGxvdChkZl9ob3RlZGdlc19hcHJpbDE2cHRfZGF5LCBhZXMoYXZnX2l0bSkpICsgCiAgc2NhbGVfeF9sb2cxMChicmVha3MgPSBzZXEoMCwxMDAwLDIwMCkpICsKICBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgICsgCiAgeGxhYigiIExvZyBJbnRlcnNlc3Npb24gdGltZShtaW4pIikgCiAgCmU0IDwtICBnZ3Bsb3QoZGZfaG90ZWRnZXNfYXByaWwxNnB0X25pZ2h0LCBhZXMoeCA9IGF2Z19pdG0pKSArIAogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gc2VxKDAsMTAwMCwyMDApKSArCiAgc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICArCiAgeGxhYigiIExvZyBJbnRlcnNlc3Npb24gdGltZShtaW4pIikgCgpncmlkLmFycmFuZ2UoZTMsIGU0LCBuY29sPSAyLCB0b3AgID0gIkVDREYgQXZlcmFnZSBJbnRlcnNlc3Npb24gdGltZSBkYXkoPjUwKSAiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CiMgQ2xhc3NpZnlpbmcgcG9pbnRzIGJ5IGRheSBmb3IgRUNERiAKZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCA8LW11dGF0ZShkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBjbGFzcyA9IGlmZWxzZShob3VyKHRpbWUpID49NyAmIGhvdXIodGltZSkgPD0gMjAsIAogICAgICAgICAgICAgICAgICAgICAgICAiZGF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5pZ2h0IikpCgpkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoaW50ZXJzZXNzaW9uX3RpbWUgPjApICU+JSAKICBzdWJzZXQod2F5X2lkICVpbiUgZGZfaG90ZWRnZXNfYXByaWwxNnB0JHdheV9pZCkgJT4lIAogIGdncGxvdCggYWVzKGludGVyc2Vzc2lvbl90aW1lLCBjb2xvcj0gY2xhc3MgKSkgKyAKICBzY2FsZV94X2xvZzEwKCkgKyBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgKyAKICBnZ3RpdGxlKCJJbnRlcnNlc3Npb24gdGltZSA+NTAgc2Vzc2lvbnMgUG9ydG8iKQpgYGAKCgoKCmBgYHtyICBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRSB9CgojIFNhbWUgYXMgcGxvdGx5IGJlZm9yZSBidXQgc2VwYXJhdGUuIElnbm9yZS4gCgpFQ0RGIGFsbCBieSAjcG9pbnRzIAplY2RmX2FsbCA8LSBnZ3Bsb3QoZGZfb3NtX2VkZ2UsIGFlcyhwb2ludHMpKSArIAogIHNjYWxlX3hfbG9nMTAoKSArIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArIHhsYWIoIkFsbCBwb2ludHMiKQoKZWNkZl9kYXk8LSBnZ3Bsb3QoZGZfb3NtX2VkZ2UsIGFlcyhwb2ludHMpKSArIAogIHNjYWxlX3hfbG9nMTAoKSArIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArIHRpdGxlKCJFQ0RGIGRheSIpKyB4bGFiKCJQb2ludHMgYXQgZGF5IikKCmVjZGZfbmlnaHQgPC0gZ2dwbG90KGRmX29zbV9lZGdlLCBhZXMocG9pbnRzKSkgKyAKICBzY2FsZV94X2xvZzEwKCkgKyBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgKyB0aXRsZSgiRUNERiBuaWdodCIpKyB4bGFiKCJQb2ludHMgYXQgbmlnaHQiKQoKZ3JpZC5hcnJhbmdlKGVjZGZfYWxsLGVjZGZfZGF5LGVjZGZfbmlnaHQsICBuY29sPTMpCgpgYGAKCgpFQ0RGIGJ5ICNzZXNzaW9ucyAKCmBgYHtyIGVjaG89RkFMU0V9CmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShzZXNzaW9ucyA9IG4oKSApICU+JSAKICBnZ3Bsb3QoYWVzKHNlc3Npb25zKSkgKyAKICBzY2FsZV94X2xvZzEwKCkgKyBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgKwogIGdndGl0bGUoIkVDREYgbnVtYmVyIG9mIHNlc3Npb25zIGFsbCBQb3J0byIpCiAgCmBgYAoKIyMjICBFZGdlcyB3aXRoID41MCBzZXNzaW9ucy4gCgoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQpsb3cxIDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgc3Vic2V0KCBpbnRlcnNlc3Npb25fdGltZSA8IHF1YW50aWxlKGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkaW50ZXJzZXNzaW9uX3RpbWUsIDAuMzUpKSAlPiUgCiAgZ2dwbG90KGFlcyhpbnRlcnNlc3Npb25fdGltZSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTApICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDIwMCwxMCkpKwogIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lIChtaW5zKSIpICsgCiAgZ2d0aXRsZSgiTG93ZXN0IDM1JSBpbnRlcnNlc3Npb24gdGltZSA+NTAiKQoKZ2dwbG90bHkobG93MSkKYGBgCgoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQpjMSA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBzdWJzZXQod2F5X2lkICVpbiUgZGZfaG90ZWRnZXNfYXByaWwxNnB0JHdheV9pZCkgJT4lIAogIGdncGxvdChhZXMoaW50ZXJzZXNzaW9uX3RpbWUsIGZpbGwgPSBjbGFzcykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oKSArIAogIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lIChtaW4pIikgKwogIHhsaW0oYygwLDMwMDApKSArCiAgeWxpbShjKDAsNTAwMCkpICsKICBnZ3RpdGxlKCJJbnRlcnNlc3Npb24gdGltZSA+NTAgZGF5L25pZ2h0IikKCmdncGxvdGx5KGMxKSAKYGBgCgoKClRvcCAxMCUgcG9pbnRzCmBgYHtyIGVjaG8gPSBGQUxTRSwgZXZhbD1UUlVFfQoKI05vdCBuZWNlc3NhcnkgCgpzdW1tYXJ5KGRmX3BvaW50c19ob3RlZGdlc19hcHJpbDE2cHQkcG9pbnRzKQpxdWFudGlsZShkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0JHBvaW50cywgMC45MCkKCiBib3hwbG90KGRmX3BvaW50c19ob3RlZGdlc19hcHJpbDE2cHQkcG9pbnRzKSAgCgoKYGBgCgoKIyMgTWFwIHBvaW50cyBBcHJpbCAyMDE2CgpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQojTmVjZXNzYXJ5IGZvciBtYXBwaW5nIAoKI1Jlb3JkZXIgY29sdW1ucwpkZl9vc21fZWRnZSA8LSBkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBzZWxlY3Qod2F5X2lkLCBwb2ludHMpCgpkZl9vc21fZWRnZSA8LSBkZl9wb2ludHNfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIHNlbGVjdCh3YXlfaWQsIHBvaW50cykKCmRmX29zbV9lZGdlIDwtIGRmX3BvaW50c19zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX29zbV9lZGdlX2lkcyR3YXlfaWQpICU+JSAKICBzZWxlY3Qod2F5X2lkLCBwb2ludHMpCgojVXNlIHRoaXMKZGZfb3NtX2VkZ2UgPC0gZGZfc2Vzc2lvbnNfMTAwZWRnZXNfYXByaWwxNnB0ICAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX29zbV9lZGdlX2lkcyR3YXlfaWQpICU+JSAKICBzZWxlY3Qod2F5X2lkLCBzZXNzaW9ucykKCiNMaXN0IGJlZm9yZSBwYXNzaW5nIHRvIG1hcC4KbGlzdF9vc21fZWRnZSA8LSBkZl9vc21fZWRnZVssIDFdCgpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CiMgQ3JlYXRpbmcgdGhlIGVtcHR5IG1hcCBvZiBQb3J0bwoKI1BvaW50cwojYm94cGxvdChkZl9vc21fZWRnZSRzZXNzaW9ucykKCmZldXAgPC0gICBxdWFudGlsZShkZl9vc21fZWRnZSRzZXNzaW9ucywgMC45MTUpCnN1cGVyaW9yIDwtIHF1YW50aWxlKGRmX29zbV9lZGdlJHNlc3Npb25zLCAwLjgpCm1lZGlvIDwtIHF1YW50aWxlKGRmX29zbV9lZGdlJHNlc3Npb25zLCAwLjcpCmxvdyA8LSBxdWFudGlsZShkZl9vc21fZWRnZSRzZXNzaW9ucywgMC41KQpmZXVwIDwtIDE1NQpzdXBlcmlvciA8LSA1MAptZWRpdW0gPC0gMjUKbG93IDwtMjUKCm0gPC0gbGVhZmxldCgpICU+JSBzZXRWaWV3KGxuZz0tOC42MTQxOSwgbGF0PTQxLjE2MzExLCB6b29tID0gMTMpCm0gPC0gYWRkVGlsZXMobSkgCm0gPC0gYWRkUHJvdmlkZXJUaWxlcyhtLCAiQ2FydG9EQi5Qb3NpdHJvbiIpCgoKY291bnRlciA8LSAxCgpmb3Iod2F5X2lkIGluIGxpc3Rfb3NtX2VkZ2UpIHsKICAKICAKICBkZl93YXlfaWQgPC0gZGJHZXRRdWVyeShjb25fb3NtLCBwYXN0ZTAoIlNFTEVDVCBzdF9hc3RleHQoc3RfdHJhbnNmb3JtKHdheSwgNDMyNikpIEFTIGxpbmUgRlJPTSBwbGFuZXRfb3NtX2xpbmUgV0hFUkUgcGxhbmV0X29zbV9saW5lLm9zbV9pZCA9ICIsIHdheV9pZCkpCiAgCiAgbGluZSA8LSBkZl93YXlfaWQkbGluZQogIGxpbmUgPC0gYXMuY2hhcmFjdGVyKGxpbmUpCiAgCiAgbGluZSA8LSB1bmxpc3Qoc3Ryc3BsaXQobGluZSwgc3BsaXQ9JygnLCBmaXhlZD1UUlVFKSlbMl0KICBsaW5lIDwtIHN1YnN0cihsaW5lLCAxLCBuY2hhcihsaW5lKSAtIDEpCiAgCiAgcGFyc2VkX2xpbmUgPC0gc3Ryc3BsaXQobGluZSwgIiwiKQogIAogIGxvbnMgPC0gYygpCiAgbGF0cyA8LSBjKCkKICAKICBpZihsZW5ndGgocGFyc2VkX2xpbmUpICE9IDApIHsKICAgIAogICAgI0RlZmluaW5nIGxvbnMgYW5kIGxhdHMgYXMgdmFyaWFibGVzIHRvIHVzZSBsYXRlci4KCiAgICBmb3IoY29vcmQgaW4gcGFyc2VkX2xpbmVbWzFdXSkgewogICAgICAKICAgICAgbG9uIDwtIHVubGlzdChzdHJzcGxpdChjb29yZCwgc3BsaXQ9JyAnLCBmaXhlZD1UUlVFKSlbMV0KICAgICAgbGF0IDwtIHVubGlzdChzdHJzcGxpdChjb29yZCwgc3BsaXQ9bG9uLCBmaXhlZD1UUlVFKSlbMl0KICAgICAgbGF0IDwtIHN1YnN0cihsYXQsIDIsIG5jaGFyKGxhdCkpCiAgICAgIAogICAgICBsb24gPC0gYXMubnVtZXJpYyhsb24pCiAgICAgIGxhdCA8LSBhcy5kb3VibGUobGF0KQogICAgICAKICAgICAgbG9ucyA8LSBjKGxvbnMsIGxvbikKICAgICAgbGF0cyA8LSBjKGxhdHMsIGxhdCkKICAgICAgCiAgICB9CiAgICAKICAgIGlmKGRmX29zbV9lZGdlW2NvdW50ZXIsIDJdID4gZmV1cCkgewogICAgICAgICAgCiAgICAgICAgICBtIDwtIGFkZFBvbHlsaW5lcyhtLCBsb25zLCBsYXRzLCBjb2xvcj0ncmVkJywgcG9wdXAgPSBwYXN0ZSgiIiwgd2F5X2lkLCBzZXAgPSAiIikpIAogICAgCiAgICAgICAgfSBlbHNlIGlmIChkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA+PSBzdXBlcmlvciAmJiBkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA8PSBmZXVwKSB7CiAgICAgICAgICAKICAgICAgICAgIG0gPC0gYWRkUG9seWxpbmVzKG0sIGxvbnMsIGxhdHMsIGNvbG9yPSdibHVlJywgcG9wdXAgPSBwYXN0ZSgiIiwgd2F5X2lkLCBzZXAgPSAiIikpICAKICAgICAgICAKICAgICAgICB9IGVsc2UgaWYgKGRmX29zbV9lZGdlW2NvdW50ZXIsIDJdID49IG1lZGlvICYmIGRmX29zbV9lZGdlW2NvdW50ZXIsIDJdIDw9IHN1cGVyaW9yKSB7CiAgICAgICAgICAKICAgICAgICAgIG0gPC0gYWRkUG9seWxpbmVzKG0sIGxvbnMsIGxhdHMsIGNvbG9yPSdncmV5JywgcG9wdXAgPSBwYXN0ZSgiIiwgd2F5X2lkLCBzZXAgPSAiIikpCiAgICAgICAgICAKICAgICAgICB9IGVsc2UgaWYgKGRmX29zbV9lZGdlW2NvdW50ZXIsIDJdID49IGxvdyAmJiBkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA8PSBtZWRpbykgewogICAgICAgICAgCiAgICAgICAgICBtIDwtIGFkZFBvbHlsaW5lcyhtLCBsb25zLCBsYXRzLCBjb2xvcj0nZ3JleScsIHBvcHVwID0gcGFzdGUoIiIsIHdheV9pZCwgc2VwID0gIiIpKQogICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvdW50ZXIgPC0gY291bnRlciArIDEgCiAgICAgICAgCiAgICAgIH0KICAgICAgCiAgICAgICNjb250ZW50IDwtIHBhc3RlKCJ3Iiwgd2F5X2lkLCBzZXAgPSAiIikKICAgICAgI20gPC0gYWRkUG9wdXBzKG0sIGxvbnMsIGxhdHMsIGNvbnRlbnQsIG9wdGlvbnMgPSBwb3B1cE9wdGlvbnMoY2xvc2VCdXR0b24gPSBUUlVFKSkKICAgICAgI20gPC0gYWRkTGFiZWxPbmx5TWFya2VycyhtLCBsb25zLGxhdHMsIGxhYmVsID0gcGFzdGUoIiIsIHdheV9pZCwgc2VwID0gIiIpLCAKICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9wdGlvbnMgPSBsYWJlbE9wdGlvbnMobm9IaWRlID0gRiwgdGV4dHNpemUgPSAiMTVweCIpKQogICAgICAjcHJpbnQobGluZSkKICAgIAogIH0KCmBgYAojIyMgU2hvd2luZyBtYXBzIAoKVHJhZmZpYyAgTWFwIEFwcmlsIFBvcnRvIDIwMTYgYWxsCmBgYHtyIGV2YWw9IFRSVUV9CiMgU2hvd2luZyBNYXAuCm0xIDwtIG0KbTEKI21hcHNob3QobSwgdXJsID0gcGFzdGUwKGdldHdkKCksICIvbWFwLmh0bWwiKSkKYGBgCgpUcmFmZmljICBNYXAgQXByaWwgMjAxNiBhbGwgPjUwCmBgYHtyIGVjaG89RkFMU0V9Cm1fNTAgPC0gbQptXzUwIApgYGAKClRyYWZmaWMgZGF5IE1hcCBBcHJpbCAyMDE2CmBgYHtyIGVjaG89RkFMU0V9Cm1fNTBfZGF5IDwtIG0KbV81MF9kYXkKYGBgCgpUcmFmZmljIG5pZ2h0IE1hcCBBcHJpbCAyMDE2CmBgYHtyIGVjaG89RkFMU0V9Cm1fMjBfbmlnaHQgPC0gbQptXzIwX25pZ2h0CmBgYAoKVG9wIDEyIGVkZ2VzIAoKYGBge3IgZWNobz1GQUxTRX0KbV9ob3QgPC0gbQptX2hvdApgYGAKCmBgYHtyIGVjaG89RkFMU0V9Cm1fMTAwIDwtIG0KbV8xMDAKYGBgCgoKPCEtLSBJZ25vcmUgdGhpcyBtYXBzIGZvciB0aGUgbW9tZW50ICAgCk1hcCBJbnRlcnNlc3Npb24gdGltZSBhbGwgMS4zMGguCmBgYHtyIGVjaG89RkFMU0V9Cm1faXRtIDwtIG0KbV9pdG0KYGBgCgpNYXAgSW50ZXJzZXNzaW9uIHRpbWUgKDwxLjNoKSBkYXkuCmBgYHtyIGVjaG89RkFMU0V9Cm1faXRtX2RheSA8LSBtCm1faXRtX2RheQojbWFwc2hvdChtX25pZ2h0X3NlbXNlc3Npb25zLCBmaWxlID0gIn4vbWFwcy90b3BfaW50ZXJzZXNzaW9uc19uaWdodF9hcHJpbC5wbmciKQpgYGAKTWFwIEludGVyc2Vzc2lvbiB0aW1lICg8MmgpbmlnaHQuCmBgYHtyIGVjaG89RkFMU0V9Cm1faXRtX25pZ2h0IDwtIG0KbV9pdG1fbmlnaHQKI21hcHNob3QobSwgZmlsZSA9ICJ+L21hcHMvX2FsbF9hcHJpbC5wbmciKQpgYGAKLS0+CgojIyAjU2Vzc2lvbnMgYnkgZGF0ZSA+NTAKCiMjIyBEYXkgb2YgdGhlIHdlZWsgCmBgYHtyIGVjaG89IEZBTFNFfSAKZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBncm91cF9ieSh3ZWVrZGF5ID13ZGF5KHRpbWUpKSAlPiUgCiAgc3VtbWFyaXNlKHdheV9pZHMgPSBuKCkpICU+JSAKICBnZ3Bsb3QoYWVzKHdlZWtkYXksd2F5X2lkcykpICsgCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiRG9taW5nbyIsICJTZWd1bmRhIiwgIlRlcsOnYSIsICJRdWFydGEiLCAiUXVpbnRhIiwgCiAgICAiU2V4dGEiLCAiU8OhYmFkbyIpKQoKYGBgCgojIyMgQnkgZGF5IApgYGB7ciBlY2hvPSBGQUxTRX0KZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgc3Vic2V0KHdheV9pZCAlaW4lIGRmX2hvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBncm91cF9ieShkYXkgPWRheSh0aW1lKSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyhkYXksbikpICsgCiAgZ2VvbV9saW5lKCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEsMzAsMSkpCgpgYGAKCiMjQnkgaG91ciAKYGBge3IgZWNobz0gRkFMU0V9IApkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBzdWJzZXQod2F5X2lkICVpbiUgZGZfaG90ZWRnZXNfYXByaWwxNnB0JHdheV9pZCkgJT4lIAogIGdyb3VwX2J5KGhvdXIgPWhvdXIodGltZSkpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoaG91cixuKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDIzLDEpKQoKYGBgCgojIyBTcGVlZHMgPjUwCgpgYGB7cn0KIyBTcGVlZCBieSB3YXlfaWQgYW5kIHNlc3Npb24uXAphdmdfc3BlZWRfd2F5aWQgPC0gZGZfc3BlZWQgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkKSAlPiUgCiAgc3VtbWFyaXNlKGF2Z19zcGVlZCA9IG1lYW4oKHNwZWVkKjE4KS81KSwgbiA9IG4oKSApCgpnZ3Bsb3QoYXZnX3NwZWVkX3dheWlkLCBhZXMoYXZnX3NwZWVkKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMykgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBdmdfc3BlZWQoa20vaCkiLCAgYnJlYWtzID0gc2VxKDAsIDE1MCwgMykgKQpgYGAKClNwZWVkIGJ5IHdlZWsgCmBgYHtyIGVjaG89RkFMU0V9CmRmX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkod2Vla2RheSA9d2RheSh0aW1lKSkgJT4lIAogIHN1bW1hcmlzZShhdmdfc3BlZWQgPSBtZWFuKChzcGVlZCoxOCkvNSkpICU+JSAKICBnZ3Bsb3QoYWVzKHdlZWtkYXksIGF2Z19zcGVlZCkpICsgCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiRG9taW5nbyIsICJTZWd1bmRhIiwgIlRlcsOnYSIsICJRdWFydGEiLCAiUXVpbnRhIiwgCiAgICAiU2V4dGEiLCAiU8OhYmFkbyIpKSArCiAgeWxhYigiQXZnIHNwZWVkIGttL2giKQpgYGAKClNwZWVkIGJ5IGRheQoKYGBge3IgZWNobz1GQUxTRX0KZGZfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieShkYXkgPWRheSh0aW1lKSkgJT4lIAogIHN1bW1hcmlzZShhdmdfc3BlZWQgPSBtZWFuKChzcGVlZCoxOCkvNSkpICU+JSAKICBnZ3Bsb3QoYWVzKGRheSwgYXZnX3NwZWVkKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDMwLDEpKSsKICB5bGFiKCJBdmcgc3BlZWQga20vaCIpCmBgYAoKU3BlZWQgYnkgaG91cgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KGhvdXIgPWhvdXIodGltZSkpICU+JSAKICBzdW1tYXJpc2UoYXZnX3NwZWVkID0gbWVhbigoc3BlZWQqMTgpLzUpKSAlPiUgCiAgZ2dwbG90KGFlcyhob3VyLCBhdmdfc3BlZWQpKSArIAogIGdlb21fbGluZSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpKwogIHlsYWIoIkF2ZyBzcGVlZCBrbS9oIikKYGBgCgpOdW1iZXIgb2Ygc2Vzc2lvbiBwZXIgaG91cgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogICAgZmlsdGVyKHdkYXkodGltZSkgIT0gMSAsIHdkYXkodGltZSkgIT0gNyApICU+JSAKICAgIGdyb3VwX2J5KGhvdXIgPWhvdXIodGltZSkpICU+JSAKICAgIHN1bW1hcmlzZShzZXNzaW9ucyA9IG5fZGlzdGluY3Qoc2Vzc2lvbl9pZCkpICU+JSAKICBnZ3Bsb3QoYWVzKGhvdXIsIHNlc3Npb25zKSkgKyAKICBnZW9tX2xpbmUoKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpCmBgYAoKV2F5c19pZHMgcGVyIGhhbGYgaG91cgpgYGB7cn0KcHJ1ZWJhIDwtIHRhYmxlKGN1dChmaWx0ZXIoZGZfaG90ZWRnZXNfYXByaWwxNnB0LCBkYXkodGltZSkgPCA3KSR0aW1lLCBicmVha3MgPSAiMzAgbWlucyIpKQpwbG90KHBydWViYSwgeGxhYiA9ICJkYXRlIiwgeWxhYiA9ICJmcmVxdWVuY3kiKSAKYGBgCgojIyBUaW1lIHNlcmllIHBlciB3YXlfaWQgCgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKCB3YXlfaWQgPT0gbGlzdF9vc21fZWRnZVszXSApICU+JSAKICBwbG90X2x5KHg9IH50aW1lLCB5PSB+KHNwZWVkKjE4KS81LCBjb2xvciA9IH5jbGFzcykgJT4lIAogIGxheW91dCh0aXRsZSA9IHBhc3RlKCJUaW1lIHNlcmllcyBvZiBzcGVlZCBmb3Igd2F5X2lkIixsaXN0X29zbV9lZGdlWzNdLCBzZXAgPSAiICIgKSx5YXhpcyA9IGxpc3QodGl0bGU9IlNwZWVkIChrbS9oKSIpLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGU9IkRhdGUiKSkKCmBgYAoKYGBge3J9CmZpbHRlcihkZl9ob3RlZGdlc19hcHJpbDE2cHQsIHdheV9pZCA9PSAzNzE0MTk2NyApICU+JSAKICBncm91cF9ieShkYXkodGltZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9IHRpbWUsIHk9IChzcGVlZCoxOCkvNSkpICsgCiAgZ2VvbV9saW5lKCkKYGBgCgojUG9pbnRzIHRpcmFkb3MgCgpgYGB7cn0KCmBgYAoKCgoK